package br.com.inner.custom;

import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

import br.com.inner.modelo.Usuario;

public class Mail {

	private MailRemetente remetente;
	private MailDestinatario destinatario;
	
	private String assunto;
	private String mensagem;
	
	private void valida() throws Exception{
		System.out.println("Entrou no valida da classe Mail");
		if (remetente.getRemetente() == null){
			throw new Exception("erro.email.sem.remetente");
		}

		if (destinatario.getDestinatario() == null && destinatario.getDestinatarios() == null){
			throw new Exception("erro.email.sem.destinatario");
		}
		
	}
	
	/**
	 * @return Returns the assunto.
	 */
	public String getAssunto() {
		return assunto;
	}
	/**
	 * @param assunto The assunto to set.
	 */
	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}
	/**
	 * @return Returns the destinatario.
	 */
	public MailDestinatario getDestinatario() {
		return destinatario;
	}
	/**
	 * @param destinatario The destinatario to set.
	 */
	public void setDestinatario(MailDestinatario destinatario) {
		this.destinatario = destinatario;
	}
	/**
	 * @return Returns the mensagem.
	 */
	public String getMensagem() {
		return mensagem;
	}
	/**
	 * @param mensagem The mensagem to set.
	 */
	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}
	/**
	 * @return Returns the remetente.
	 */
	public MailRemetente getRemetente() {
		return remetente;
	}
	/**
	 * @param remetente The remetente to set.
	 */
	public void setRemetente(MailRemetente remetente) {
		this.remetente = remetente;
	}
	
	public void sendMail(String path) throws Exception{
		System.out.println("Entrou no sendMail da classe Mail");
		valida();
		
		try {
			
			/*Context iniCtx = new InitialContext();
			Context envCtx = (Context) iniCtx.lookup("java:comp/env");
			Session session = (Session)envCtx.lookup("mail/Session");*/
			
			File f = new File(path);
			System.out.println("Pegou o File: "+path);
			Properties p = new Properties();
		
			FileInputStream fis = new FileInputStream(f);
			p.load(fis);
			System.out.println("Carregou o poperties");
			String host = p.getProperty("host");
			System.out.println("Host: "+host);
			String porta = p.getProperty("porta");
			System.out.println("Porta: "+porta);
			
			Properties props = System.getProperties();
			props.put("mail.transport.protocol", "smtp");
			props.put("mail.smtp.starttls.enable","true");
			props.put("mail.smtp.auth", "true");
			props.put("mail.smtp.host", host);
			props.put("mail.smtp.port",porta);
			
			Session session = Session.getDefaultInstance(props, new Autenticador());
			System.out.println("Setou o Autenticador");
			//Session session = Session.getDefaultInstance(props);
			
			Message message = new MimeMessage(session);
			message.setFrom(remetente.getRemetente());
			System.out.println("Setou na mensagem o remetente");
			InternetAddress to[] = destinatario.getDestinatarios();
			message.setRecipients(Message.RecipientType.TO,to);
			System.out.println("Setou na mensagem os destinatarios");
			message.setSubject(getAssunto());
			System.out.println("Setou o Assunto");
			message.setContent(getMensagem(),"text/html");
			System.out.println("Vai enviar");
			Transport.send(message);
			System.out.println("Enviou");
			
		} catch (Exception e) {
			System.out.println("Deu erro");
			e.printStackTrace();
			throw new Exception("erro.enviar.email");
		}

		
	}
	
	private static Mail instance = null;
	
	public static Mail getInstance(){
		if(instance == null ){
			instance = new Mail();
		}
		return instance;
	}
	
	//Mail(){}
	
	/*public void envia(BigDecimal cdUsuario, String path, String tipoMensagem) throws CustomException{
		String from = "inner.ce@gmail.com";
		
		GerenciadorDeMensagens gm = null;
		Mensagem m = null;
		
		try{
			gm = GerenciadorDeMensagens.getInstance();
			m = gm.getMensagem(tipoMensagem);
			
			File f = new File(path);
			Properties p = new Properties();
		
			FileInputStream fis = new FileInputStream(f);
			p.load(fis);
			
			String host = p.getProperty("host");
			String porta = p.getProperty("porta");
			
			Properties props = System.getProperties();
			props.put("mail.transport.protocol", "smtp");
			props.put("mail.smtp.starttls.enable","true");
			props.put("mail.smtp.auth", "true");
			props.put("mail.smtp.host", host);
			props.put("mail.smtp.port",porta);
			
			Session session = Session.getDefaultInstance(props, new Autenticador());
			
			String assunto = m.getAssunto();
			
			String corpo = m.getCorpo();
			Usuario usu = JPAManager.getEntityManager().find(Usuario.class, cdUsuario);
			corpo = corpo.replaceAll(":cdUsuario", usu.getCdUsuario().toString());
			corpo = corpo.replaceAll(":nmDestinatario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":nmUsuario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":senha", usu.getPassUsuario());
			corpo = getTodoCorpo(corpo, tipoMensagem, usu);
			
			String mensagem = corpo;
			
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress(from));
			InternetAddress[] address = {new InternetAddress(usu.getEmailUsuario())};
		    msg.setRecipients(Message.RecipientType.TO, address);
		    msg.setSubject(assunto);
		    
		    msg.setContent(mensagem, "text/html");
		    //create and fill the first message part
		    MimeBodyPart mbp1 = new MimeBodyPart();
		    mbp1.setText(mensagem);
		    
		    msg.setSentDate(new Date());
		    
		  	//send the message
		    Transport.send(msg);
		    
		}catch(Exception e){
			e.printStackTrace();
			throw new CustomException("Erro na classe Mail");
		}
	}
	
	public static String getTodoCorpo(String corpo, String tipoMensagem, Object o){
		String retorno = "";
		if(tipoMensagem.equalsIgnoreCase(Mensagem.CADASTRO_USUARIO)){
			Usuario usu = (Usuario)o;
			corpo = corpo.replaceAll(":cdUsuario", usu.getCdUsuario().toString());
			corpo = corpo.replaceAll(":nmDestinatario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":nmUsuario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":senha", usu.getPassUsuario());
			retorno = corpo;
		}
		if(tipoMensagem.equalsIgnoreCase(Mensagem.ESQUECI_SENHA_USUARIO)){
			Usuario usu = (Usuario)o;
			corpo = corpo.replaceAll(":cdUsuario", usu.getCdUsuario().toString());
			corpo = corpo.replaceAll(":nmDestinatario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":nmUsuario", usu.getNmUsuario());
			corpo = corpo.replaceAll(":senha", usu.getPassUsuario());
			retorno = corpo;
		}
		return retorno;
	}*/
}
